//
// Copyright (c) 2024 BPer
//
#ifndef SRC_BPERRTC_BPERRTCSTATS_H_
#define SRC_BPERRTC_BPERRTCSTATS_H_

#include <bperrtp/BPerRtcp.h>
#include <bperrtp/BPerRtpPacket.h>

#include <bperutil/BPerType.h>

typedef struct {
	uint16_t startSn;
	uint16_t maxSn;
	uint16_t cycleCount;
	uint16_t lastSn;
	uint32_t lastExpected;
	uint32_t lastLost;
	uint64_t rtpPacketCount;
	uint64_t lastRtpPcackCount;


    uint64_t rtt;
    uint64_t totalRtt;
    double fractionLost;
    uint64_t reportsReceived;

    uint64_t lostVideoPacketCount;
    uint64_t preLostVideoPacketCount;

}BPerRemoteRecvStats;

typedef struct{
	BPerRemoteRecvStats audio;
	BPerRemoteRecvStats video;
}BPerRecvStats;

typedef struct{
	uint32_t frameCount;
	uint32_t pliCount;
	uint32_t nackCount;
	uint32_t reSenndNackPacketCount;
	uint64_t videoRtpPacketCount;
	uint64_t videoRtpBytes;
	uint64_t audioRtpPacketCount;
	uint64_t audioRtpBytes;

	uint64_t preVideoRtpPacketCount;
	uint64_t preAudioRtpPacketCount;

	uint64_t lastVideoSendTime;
	uint64_t lastAudioSendTime;

	uint64_t audioStartTime;
	uint64_t videoStartTime;
}BPerSendStats;

typedef struct{
	BPerSendStats sendStats;
	BPerRecvStats recvStats;
	void (*on_pub_videoRtp)(BPerSendStats* stats,BPerRtpPacket* pkt,BPerBuffer* buf);
	void (*on_pub_audioRtp)(BPerSendStats* stats,BPerRtpPacket* pkt,BPerBuffer* buf);
	void (*on_play_videoRtp)(BPerRecvStats* stats,BPerRtpPacket* pkt);
	void (*on_play_audioRtp)(BPerRecvStats* stats,BPerRtpPacket* pkt);
	int32_t (*on_recvRR)(BPerBool isAudio,BPerRecvStats* recvStats,BPerSendStats* sendStats,BPerRtcpCommon *rtcp);
	uint8_t (*getFractionLost)(BPerRemoteRecvStats* stats);
	uint64_t (*getLostCount)(BPerRemoteRecvStats* stats);
}BPerRtcStats;

void bPer_create_rtcstats(BPerRtcStats* stats);
void bPer_destroy_rtcstats(BPerRtcStats* stats);

#endif /* SRC_BPERRTC_BPERRTCSTATS_H_ */
